package com.exonline.front.controller.login;

import com.exonline.commons.dao.DaoImpl;
import com.exonline.commons.dao.IDao;
import com.exonline.commons.entity.Student;
import com.exonline.commons.entity.Teacher;
import org.apache.commons.dbutils.handlers.BeanHandler;

import java.sql.SQLException;

/**
 * @desc  用户登录模块的M层
 * @author  hbrj
 */
public class LoginService  {

    // 引入数据访问对象
    IDao<Object> loginDao = new DaoImpl<>();

    /**
     * @desc   1. 注册方法,插入学生数据,如果手机号不存在，则插入新数据
     * @author hbrj
     * @param id 用户id
     * @param sname 学生姓名
     * @param phone 用户手机号
     * @param password 用户密码
     * @return
     */
    public int register(String id, String sname, String phone, String password) {
        try {
            //1. 先检查手机号是否已存在于学生表中(存在则不能重复创建)
            boolean studentExists = checkPhoneExistsInStudentTable(phone);

            //2. 如果学生不存在，则创建新学生记录
            if (studentExists) {
                Student newStudent = new Student(); // 创建一个学生对象
                newStudent.setId(id);  // 设置学生ID
                newStudent.setSname(sname); // 设置学生姓名
                newStudent.setPhone(phone); // 设置学生手机号
                newStudent.setPassWord(password);  // 设置学生密码
                // 使用loginDao的插入方法将新学生数据插入数据库
                int rowsAffected = loginDao.updateWithTransaction("insert into student (id ,sname ,phone, password) values (?,?,?,?)", id, sname, phone, password);
                return rowsAffected;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return 0;
    }
    /**
     * @desc  1.2 检查手机号是否已存在于学生表中
     * @param phone 用户手机号
     * @return true 如果手机号已存在于学生表中，否则返回 false
     */
    private boolean checkPhoneExistsInStudentTable(String phone) throws SQLException {
        // 使用loginDao的queryForObject方法，根据传入的查询语句和结果处理器（BeanHandler），从学生表中查询符合条件（phone字段值等于传入的手机号）的记录。
        // BeanHandler用于将查询结果集的第一条记录转换为指定的Java对象（这里是Student类对象），如果查询到记录则返回对应的Student对象，否则返回null。
        Student student = loginDao.queryForObject("select * from student where phone = ?", new BeanHandler<>(Student.class), phone);
        return student == null;
    }


    /**
     * @desc  2.登录方法,登录并根据用户名和密码查询用户信息并返回用户的菜单。
     * @param phone    用户手机号
     * @param password 用户密码
     * @param role     用户角色（"教师" 或 "学生"）
     * @return 如果登录成功，根据角色返回对应的教师或学生对象，否则返回 null
     */
    public Object login(String phone, String password, String role) throws SQLException {
        if ("教师".equals(role)) {
            // 1.使用loginDao的queryForObject方法，根据传入的查询教师表的SQL语句和结果处理器（BeanHandler），从教师表中查询符合条件（phone和password字段值分别等于传入的手机号和密码）的记录。
            Teacher teacher = loginDao.queryForObject("select id,tname,workyears,direction,introduce,email,phone,status from teacher where phone=? and password=?  ",new BeanHandler<>(Teacher.class),phone,password);
            // 1.1如果查询到记录且教师账号的状态为 "1"（表示可用，具体状态值根据业务设定），则返回对应的Teacher对象，代表教师登录成功；否则返回 null，表示登录失败。
            if (teacher!= null && "1".equals(teacher.getStatus())) {
                return teacher;
            } else {
                return null;
            }
        } else if ("学生".equals(role)) {
            // 1.2针对学生角色，从学生表中查询符合手机号和密码条件且状态为可用（状态为 "1"）的记录，若查询到则返回对应的Student对象，表示学生登录成功；否则返回 null。
            Student student = loginDao.queryForObject("select id,sname,phone,status from student where phone=? and password=?",new BeanHandler<>(Student.class),phone,password);
            if (student!= null && "1".equals(student.getStatus())) {
                return student;
            }
        }
        return null;
    }
}
